远程控制

设备远程控so esay,只需两招。

第一招,修改xml文件。在xml中的apis部分根据业务逻辑自定义控制参数。然后,swaylink就会根据定义的API生成相应的控制界面。我的小车的xml文件示例:

<dev>
    <dev_id>mutao1</dev_id>
    <name>我的小车</name>
    <model>Model-I</model>
    <maker>Mutao</maker>
    <timezone>8</timezone>
    <longitude>104.04</longitude>
    <latitude>39.90</latitude>
    <height>30</height>
    <keep_online>0</keep_online>
    <apis>
        <api>
            <id>1</id>
            <name>点火</name>
            <remark>start</remark>
        </api>
        <api>
            <id>2</id>
            <name>出发</name>
            <remark>在希望的田野上</remark>
            <arg>
                <name>move</name>
                <remark>前进</remark>
                <unit>m</unit>
            </arg>
            <arg>
                <name>back</name>
                <remark>后退</remark>
                <unit>m</unit>
            </arg>
        </api>
    </apis>
</dev>

对应的swaylink控制界面请看图: 是不是很科学。在apis中有几个api控制界面就有几个控制参数,如果需要具体输入值就可以在api中写入arg就可以了,有几个输入值就有几个args。

Notice:修改了xml文件需要重新上传才能生效哦!

第二招,设备联网远程控制。首先设备要接入互联网中,然后在连入swaylink平台就可以进行控制了。 使用slink phpsdk 只需下面几行代码就能搞定。

require './SLink/SLinkClient.class.php';
$SLinkClient = new \Slink\SLinkClient('mutao1');
$SLinkClient->ctrl();

这样就可以了,然后在swaylink 上面控制界面就可以进行控制了。设备就会收到如下的控制指令。

然后设备就可以根据控制指令完成响应的动作。

其他语言接入主要是以下几个流程。1,请求接口获取端口和ip。2,向获取的端口和ip发送身份验证 3.监听端口 下面是php接入的代码

1.请求获取端口ip

请求地址 http://www.mydehui.com/swaylink.php?m=Queen&c=upload&a=willListen POST方法

请求参数:v=2.0&dev_id=xxxx&token=xxxx&load=XXXXXXXXX

接口回复:[192.168.31.109:56280]

':'前是服务器ip,服务器端口

2.身份验证

创建UDP客户端套接字向获取到的ip和端口发送数据进行身份验证。

身份验证发送数据:

{"v":"2.0","dev_id":"mutao1","token":"xxxx"}

身份验证成功收到OK两个字符。

3.监听端口

获取本地UDP客户端的ip和端口,由有客户端转为服务端,然后一直监听,slink发来的控制指令就能收到了。

以上步骤每隔三十秒重复一次,这样设备就可以一直和服务器保持连接。下面是php示例代码。

            set_time_limit(0);

            while(1){
                //获取ip和端口
                $url = SLinkClient::SERVERURL.'?m=Queen&c=upload&a=willListen';

                $this->setReqFormat($this->req['dev_id']);
                $result = $this->sendRequest($url, $this->req);
                if(empty($result)) break;
                preg_match('/\[.*\]$/', $result, $result);
                $result = explode(':', trim($result[0], '[]"'));
                $ip  = $result[0];
                $port = $result[1];

                //创建客户端连接服务器
                $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
                socket_set_option( $socket, SOL_SOCKET, SO_REUSEADDR, 1 );
                socket_set_option( $socket, SOL_SOCKET, SO_RCVTIMEO, array("sec"=>10, "usec"=>0 ) );
                socket_set_option( $socket, SOL_SOCKET, SO_SNDTIMEO, array("sec"=>3, "usec"=>0 ) );
                $flag = socket_connect($socket, $ip, $port);

                //获取本地客户端ip和端口
                socket_getsockname($socket,$locIp,$locPort);
                echo "[$locIp:$locPort]\r\n";
                if(!$flag) {
                    echo 'Cannot connect to service';
                    exit();
                }
                //发送身份验证请求{"v":"2.0","dev_id":"mutao1","token":"xxxx"}
                $buf = json_encode($this->req);
                socket_write($socket, $buf, strlen($buf));

                $data = socket_read($socket,1024);

                if($data != 'OK') continue;

                socket_close($socket);

                //关闭客户端套接字开启服务端套接字开始监听$locIp $locPort
                $socket = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
                if (!$socket) {
                    die("socket create failed . reason:" . socket_strerror(socket_last_error()));
                }
                socket_set_option( $socket, SOL_SOCKET, SO_REUSEADDR, 1 );
                socket_set_option( $socket, SOL_SOCKET, SO_RCVTIMEO, array("sec"=>30, "usec"=>0 ) );
                socket_set_option( $socket, SOL_SOCKET, SO_SNDTIMEO, array("sec"=>3, "usec"=>0 ) );

                $flag = socket_bind( $socket, $locIp, $locPort);
                if ( $flag === false ) {
                    echo "socket bind failed . reason:" . socket_strerror( socket_last_error( $socket ) );
                }

                $t = time();
                do{
                    $inMsg = false;
                    @socket_recvfrom( $socket, $inMsg, 1024, 0, $from, $port );
                    if($inMsg) {
                        echo $inMsg."\r\n";
                        socket_sendto($socket, 'OK', 2, 0, $from, $port);
                    }
                    else{
                        echo 'no message'."\r\n";
                        //三十秒内无控制信息则重新请求
                        if(time()-30>$t) break;
                    }
                }while (true);

                socket_close($socket);
            }

results matching ""

    No results matching ""